/*******************************************************************************
 * Copyright (c) 2008-2009 zhang yuexiang.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */ 
package org.xfeep.asura.bootstrap;



import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;

import org.xfeep.asura.core.ComponentDefinition;
import org.xfeep.asura.core.ContractType;
import org.xfeep.asura.core.CoreConsts;
import org.xfeep.asura.core.MultiplicityType;
import org.xfeep.asura.core.ReferenceDefinition;
import org.xfeep.asura.core.match.SmartMatcher;

@XmlType
public class DependDefinitionInfo {
	
	@XmlAttribute
	public String service;
	@XmlAttribute
	public String name;
	@XmlAttribute
	public ContractType contractType = ContractType.CAREFUL;
	@XmlAttribute
	public String matcher = "";
	@XmlAttribute
	public int order = CoreConsts.DEPEND_REF_DEFALUT_ORDER;

	public ReferenceDefinition createDependReferenceDefinition(ComponentDefinition componentDefinition) throws ClassNotFoundException {
		ReferenceDefinition rd = new ReferenceDefinition();
		rd.setComponentDefinition(componentDefinition);
		rd.setName(name);
		rd.setServiceClass(componentDefinition.getImplement().getClassLoader().loadClass(service));
		rd.setMultiplicityType( MultiplicityType.ONE_ONE  );
		if (matcher.length() > 0){
			rd.setMatcher( SmartMatcher.getMatcher(matcher, componentDefinition.getImplement()) );
		}
		rd.setContractType ( contractType );
		rd.setOrder(order);
		return rd;
		
	}
	
	public static DependDefinitionInfo convert(ReferenceDefinition drd) {
		if (drd.getBind() != null && drd.getInjectProperties() != null || CoreConsts.CONFIG_SERVICE_REF_NAME.equals(drd.getName()) ){
			throw new IllegalArgumentException("must be depend definition");
		}
		DependDefinitionInfo rdi = new DependDefinitionInfo();
		rdi.name = drd.getName();
		rdi.service = drd.getServiceClass().getName();
		rdi.contractType = drd.getContractType();
		if (drd.getMatcher() != null){
			rdi.matcher = drd.getMatcher().toString();
		}
		rdi.order = drd.getOrder();
		return rdi;
	}
	
}
